/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufc.quixada.adrs.comandos.adrs;

import br.ufc.quixada.adrs.interfaces.Comando;
import br.ufc.quixada.adrs.model.Adrs;
import br.ufc.quixada.adrs.model.Produtor;
import br.ufc.quixada.adrs.model.Visita;
import br.ufc.quixada.adrs.service.VisitaService;
import br.ufc.quixada.adrs.util.Msg;
import br.ufc.quixada.adrs.util.UtilAdrs;
import java.util.List;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Caio
 */
public class CmdAddVisita implements Comando {

    public String executa(HttpServletRequest request, HttpServletResponse response) {
        HttpSession session = request.getSession();
        if (request.getParameter("concluded").equalsIgnoreCase("False")) {
            Produtor p = (Produtor) session.getAttribute("produtor");
            Adrs adrs = (Adrs) session.getAttribute("user");

            Visita novaVisita = new Visita();
            novaVisita.setAdrs(adrs);
            novaVisita.setProdutor(p);
            novaVisita.setData(new Date());
            novaVisita.setQuestionarioQualitativo(null);
            novaVisita.setQuestionarioSanitario(null);
            novaVisita.setQuestionarioQuantitativo(null);

            session.setAttribute("visita", novaVisita);
            return "/adrs/adrs_add_visita.jsp";
        } else {
            Visita v = (Visita) session.getAttribute("visita");
            v.setData(UtilAdrs.treatToDate(request.getParameter("data")));
            if (v.getData() == null) {
                session.setAttribute("erro", Msg.INPUT_ERROR_WRONG_VISITA_DATE_FORMAT);
                return "/adrs/adrs_add_visita.jsp";
            }

            boolean permissao = verificaDuplicacaoDeFormulariosMensais(v);
            if (!permissao) {
                session.setAttribute("erro", Msg.EXISTANT_QUESTIONNAIRE);
                return "/adrs/adrs_add_visita.jsp";
            }

            VisitaService vs = new VisitaService();
            if (v.getId() != null) {
                vs.updateVisita(v);
                Produtor p = (Produtor) session.getAttribute("produtor");
                List<Visita> visitas = (List<Visita>) session.getAttribute("visitas");
                for (Visita vi : visitas) {
                    if (vi.getId().equals(v.getId())) {
                        visitas.remove(vi);
                        break;
                    }
                }
                visitas.add(v);
                p.setVisitas(visitas);
                Adrs adrs = (Adrs) session.getAttribute("user");
                adrs.setVisitas(visitas);
                session.setAttribute("produtor", p);
                session.setAttribute("user", adrs);
                session.setAttribute("visitas", visitas);
                session.setAttribute("sucesso", Msg.SUCCESSFULLY_EDITED);
            } else {
                vs.insertVisita(v);
                Produtor p = (Produtor) session.getAttribute("produtor");
                List<Visita> visitas = (List<Visita>) session.getAttribute("visitas");
                visitas.add(v);
                p.setVisitas(visitas);
                Adrs adrs = (Adrs) session.getAttribute("user");
                adrs.setVisitas(visitas);
                session.setAttribute("produtor", p);
                session.setAttribute("user", adrs);
                session.setAttribute("visitas", visitas);
                session.setAttribute("sucesso", Msg.SUCCESSFULLY_ADDED);
            }
            return "/adrs/adrs_listar_visitas.jsp";
        }
    }

    private boolean verificaDuplicacaoDeFormulariosMensais(Visita visita) {
        boolean permissao = true;
        List<Visita> visitasOcorridasNoMesEntreProdutorEAdrs = new VisitaService().getVisitasByProdutorEAdrsNoMes(visita.getProdutor().getId(), visita.getAdrs().getId(), visita.getData());
        for (Visita v : visitasOcorridasNoMesEntreProdutorEAdrs) {
            if (v.getId().equals(visita.getId())) {
                continue;
            }
            if (v.getQuestionarioQualitativo() != null && visita.getQuestionarioQualitativo() != null) {
                permissao = false;
                break;
            }
            if (v.getQuestionarioSanitario() != null && visita.getQuestionarioSanitario() != null) {
                permissao = false;
                break;
            }
            if (v.getQuestionarioQuantitativo() != null && visita.getQuestionarioQuantitativo() != null) {
                permissao = false;
                break;
            }
        }
        return permissao;
    }
}
